using System;
using System.IO;
using System.Windows.Forms;

using Livres;

namespace ULDVELH
{
    class Program
    {
        static Livre _livre = new Livre();
        static Form1 _form1 = new Form1();

        [STAThreadAttribute]
        static void Main(string[] args)
        {
            bool quit = false;
            Console.CancelKeyPress += Console_CancelKeyPress;
            Console.Write("/create, /open, /exit, /modify : ");
            switch (Console.ReadLine())
            {
                case "/open":
                    Open();
                    break;
                case "/create":
                    Creer();
                    break;
                case "/modify":
                    Open();
                    Modifier(true);
                    break;
                case "/exit":
                    Environment.Exit(0);
                    break;
                default:
                    Open();
                    break;
            }
            //LivreManuel();
            //Open();
            int choix = 1;
            NouveauLivre();
            while (!quit)
            {
                AfficheLivre(choix);
                string cmd = Console.ReadLine();
                switch (cmd)
                {
                    case "/exit":
                        Environment.Exit(0);
                        break;
                    case "/save":
                        Save();
                        break;
                    case "/open":
                        Open();
                        choix = 1;
                        break;
                    case "/create":
                        Creer();
                        choix = 1;
                        break;
                    case "/modify":
                        Modifier();
                        break;
                    default:
                        while (!(int.TryParse(cmd, out choix) && choix <= _livre.Chapitres.Count && choix > 0))
                            cmd = Console.ReadLine();
                        break;
                }
            }
        }

        static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
        {
            Save();
        }

        public static void Creer(bool form = false)
        {
            /*Création du livre et du tableau de chapitres */
            Console.Write("Nom du livre : ");
            _livre = new Livre() { Nom = Console.ReadLine(), Auteur = "Joe Dever et Gary Chalk" };
            Console.Write("\nNombre de Chapitres : ");
            int nbchap;
            int.TryParse(Console.ReadLine(), out nbchap);
            Chapitre[] _chapitres = new Chapitre[nbchap];

            /* Instanciation du tableau de chapitres */
            for (int i = 0; i < _chapitres.Length; i++)
            {
                _chapitres[i] = new Chapitre() { Titre = i + 1 };
            }

            /* Création des liens et ajout des chapitres au livre */
            for (int i = 0; i < _chapitres.Length; i++)
            {
                Console.Clear();
                Console.WriteLine("Chapitre " + _chapitres[i].Titre);
                Console.Write("Texte : ");
                string cmd;
                cmd = Console.ReadLine();
                if (cmd == "plop")
                    cmd += (i + 1);
                _chapitres[i].Texte = cmd;
                int MaxLien;
                Console.Write("\nNombre de Lien dans le chapitre " + _chapitres[i].Titre + " : ");
                int.TryParse(Console.ReadLine(), out MaxLien);
                for (int j = 0; j < MaxLien; j++)
                {
                    int chap;
                    Console.Write("\nLien " + (j + 1) + " : ");
                    int.TryParse(Console.ReadLine(), out chap);

                    Console.Write("Description : ");

                    _chapitres[i].Lien.Add(_chapitres[chap - 1], Console.ReadLine() + ".");
                }
                _livre.Chapitres.Add(_chapitres[i].Titre, _chapitres[i]);
            }
            Save();
        }

        public static void Modifier(bool form = true)
        {
            int nbchap;
            ControleBox.ControleBox ctrl;
            if (form)
            {
                ctrl = _form1.controleBox1;
                ControleBox.Controle<TextBox> txt1 = new ControleBox.Controle<TextBox>();
                txt1.Label.Text = "Nom";
                ctrl.CreateControl<TextBox>(txt1).Control.Text = _livre.Nom;

                ControleBox.Controle<TextBox> txt2 = new ControleBox.Controle<TextBox>();
                txt2.Label.Text = "Auteur";
                ctrl.CreateControl<TextBox>(txt2).Control.Text = _livre.Auteur;

                ControleBox.Controle<NumericUpDown> num1 = new ControleBox.Controle<NumericUpDown>();
                num1.Label.Text = "Nombre de chapitres";
                num1.Control.Maximum = 999;
                num1.Control.Minimum = _livre.NombreChapitre;
                ctrl.CreateControl<NumericUpDown>(num1).Control.Value = _livre.NombreChapitre;

                _form1.ShowDialog();

                nbchap = (int)num1.Control.Value;

                ctrl.removeControl<TextBox>(txt1);
                ctrl.removeControl<TextBox>(txt2);
                ctrl.removeControl<NumericUpDown>(num1);
            }
            else
            {
                Console.Write("\nNombre de Chapitres : ");
                int.TryParse(Console.ReadLine(), out nbchap);
            }
            Chapitre[] _chapitres = new Chapitre[nbchap];

            /* Instanciation du tableau de chapitres */
            foreach (var item in _livre.Chapitres)
            {
                _chapitres[item.Key - 1] = item.Value;
            }

            for (int i = _livre.NombreChapitre; i < _chapitres.Length; i++)
            {
                _chapitres[i] = new Chapitre() { Titre = i + 1 };
            }

            /* Création des liens et ajout des chapitres au livre */

            if (form)
            {
                ctrl = _form1.controleBox1;

                ControleBox.Controle<TextBox> txt1 = new ControleBox.Controle<TextBox>();
                txt1.Label.Text = "Texte";
                txt1.Control.Multiline = true;
                //ctrl.CreateControl<TextBox>(txt1);

                ControleBox.Controle<NumericUpDown> liens = new ControleBox.Controle<NumericUpDown>();
                liens.Label.Text = "Nombre de liens";
                liens.Control.Minimum = 0;
                liens.Control.Maximum = nbchap;
                liens.Control.Value = 2;
                //ctrl.CreateControl<NumericUpDown>(liens);

                ControleBox.Controle<NumericUpDown> lien = new ControleBox.Controle<NumericUpDown>();
                lien.Control.Minimum = 0;
                lien.Control.Maximum = nbchap;

                ControleBox.Controle<TextBox> desc = new ControleBox.Controle<TextBox>();
                desc.Label.Text = "Description";

                for (int i = _livre.NombreChapitre; i < _chapitres.Length; i++)
                {
                    _form1.Save.Visible = true;
                    txt1.Control.Text = "";
                    liens.Control.Value = 2;

                    ctrl.CreateControl<TextBox>(txt1);
                    ctrl.CreateControl<NumericUpDown>(liens);

                    _form1.Texte = "Chapitre " + _chapitres[i].Titre;

                    _form1.ShowDialog();

                    _chapitres[i].Texte = txt1.Control.Text;

                    ctrl.removeControl<TextBox>(txt1);
                    ctrl.removeControl<NumericUpDown>(liens);

                    ctrl.CreateControl<TextBox>(desc);
                    ctrl.CreateControl<NumericUpDown>(lien);
                    for (int j = 0; j < liens.Control.Value; j++)
                    {
                        _form1.Save.Visible = false;
                        lien.Label.Text = "Lien " + (j + 1);
                        desc.Control.Text = "";
                        _form1.ShowDialog();

                        _chapitres[i].Lien.Add(_chapitres[(int)lien.Control.Value], desc.Control.Text);
                    }
                    _livre.Chapitres.Add(_chapitres[i].Titre, _chapitres[i]);
                    ctrl.removeControl<NumericUpDown>(lien);
                    ctrl.removeControl<TextBox>(desc);
                }
            }
            else
            {
                for (int i = _livre.NombreChapitre; i < _chapitres.Length; i++)
                {
                    Console.Clear();
                    Console.WriteLine("Chapitre " + _chapitres[i].Titre);
                    Console.Write("Texte : ");
                    string cmd;
                    cmd = Console.ReadLine();
                    if (cmd == "plop")
                        cmd += (i + 1);
                    _chapitres[i].Texte = cmd;
                    int MaxLien;
                    Console.Write("\nNombre de Lien dans le chapitre " + _chapitres[i].Titre + " : ");
                    int.TryParse(Console.ReadLine(), out MaxLien);
                    for (int j = 0; j < MaxLien; j++)
                    {
                        int chap;
                        Console.Write("\nLien " + (j + 1) + " : ");
                        int.TryParse(Console.ReadLine(), out chap);

                        Console.Write("Description : ");

                        _chapitres[i].Lien.Add(_chapitres[chap], Console.ReadLine() + ".");
                    }
                    _livre.Chapitres.Add(_chapitres[i].Titre, _chapitres[i]);
                }
                //Save(); 
            }
        }

        public static void Save()
        {
            if (_livre.FileName != null)
            {
                _livre.Save(new FileStream(_livre.FileName, FileMode.Create));
            }
            else
            {
                SaveFileDialog save = new SaveFileDialog() { Filter = "Livre|*.livre", FileName = _livre.Nom, AddExtension = true };
                if (save.ShowDialog() == DialogResult.OK)
                {
                    _livre.Save(File.Create(save.FileName));
                    _livre.FileName = save.FileName;
                }
            }
        }

        public static void Open()
        {
            OpenFileDialog open = new OpenFileDialog() { Filter = "Livre|*.livre", Multiselect = false };
            if (open.ShowDialog() == DialogResult.OK)
            {
                _livre.Open(open.OpenFile());
                _livre.FileName = open.FileName;
            }
            else
                Environment.Exit(0);
        }

        static void NouveauLivre()
        {
            Console.Clear();
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.Write(_livre.Nom);
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.Write(" par : ");
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.Write(_livre.Auteur);
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.WriteLine(".");
        }

        static void AfficheLivre(int chapitre)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(" - " + _livre[chapitre].Titre + " - ");
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.WriteLine(_livre[chapitre].Texte + '\n');
            //TODO: Formatage du texte
            foreach (var lien in _livre[chapitre].Lien)
            {
                Console.Write(lien.Key.Titre + ") ");
                Console.WriteLine(lien.Value);
            }
        }
    }
}
